package com.vilen.basic.util;

import org.apache.commons.beanutils.PropertyUtils;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by vilen on 2017/2/11.
 */
public class EnumUtil {
    /**
     * 将枚举中的值转换一组序数列表
     *
     * @param clz
     * @return
     */
    public static List<Integer> enum2Ordinal(Class<? extends Enum> clz) {
        if (!clz.isEnum()) {
            return null;
        }
        Enum[] enums = clz.getEnumConstants();
        List<Integer> rels = new ArrayList<>();
        for (Enum anEnum : enums) {
            rels.add(anEnum.ordinal());
        }
        return rels;
    }

    /**
     * 将枚举中的值转换相应的名称字符串列表
     *
     * @param clz
     * @return
     */
    public static List<String> enum2Name(Class<? extends Enum> clz) {
        if (!clz.isEnum()) {
            return null;
        }
        Enum[] enums = clz.getEnumConstants();
        List<String> rels = new ArrayList<String>();
        for (Enum anEnum : enums) {
            rels.add(anEnum.name());
        }
        return rels;
    }

    /**
     * 将枚举中的值转换为序号和名称的 map
     *
     * @param clz
     * @return
     */
    public static Map<Integer, String> enum2BasicMap(Class<? extends Enum> clz) {
        if (!clz.isEnum()) {
            return null;
        }
        Enum[] enums = clz.getEnumConstants();
        Map<Integer, String> rels = new HashMap<Integer, String>();
        for (Enum anEnum : enums) {
            rels.put(anEnum.ordinal(), anEnum.name());
        }
        return rels;
    }

    /**
     * 将枚举中的值的某个属性 转换为字符串列表
     *
     * @param clz
     * @param propName 某个属性
     * @return
     */
    public static List<String> enumProp2List(Class<? extends Enum> clz, String propName) {
        if (!clz.isEnum()) {
            return null;
        }
        try {
            Enum[] enums = clz.getEnumConstants();
            List<String> rels = new ArrayList<String>();
            for (Enum anEnum : enums) {
                rels.add((String) PropertyUtils.getProperty(anEnum, propName));
            }
            return rels;
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 将枚举中的值的某个属性 转换为 序号和字符串列表
     *
     * @param clz
     * @param propName 某个属性
     * @return
     */
    public static Map<Integer, String> enumProp2OrdinalMap(Class<? extends Enum> clz, String propName) {
        if (!clz.isEnum()) {
            return null;
        }
        try {
            Enum[] enums = clz.getEnumConstants();
            Map<Integer, String> rels = new HashMap<Integer, String>();
            for (Enum anEnum : enums) {
                rels.put(anEnum.ordinal(), (String) PropertyUtils.getProperty(anEnum, propName));
            }
            return rels;
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 将枚举中的值的某个属性 转换为 名称和字符串 map
     *
     * @param clz
     * @param propName 某个属性
     * @return
     */
    public static Map<String, String> enumProp2NameMap(Class<? extends Enum> clz, String propName) {
        if (!clz.isEnum()) {
            return null;
        }
        try {
            Enum[] enums = clz.getEnumConstants();
            Map<String, String> rels = new HashMap<String, String>();
            for (Enum anEnum : enums) {
                rels.put(anEnum.name(), (String) PropertyUtils.getProperty(anEnum, propName));
            }
            return rels;
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 将枚举中的两个属性转成 map
     *
     * @param clz
     * @param keyProp   要转换成 key 名称
     * @param valueProp 要转换成 value 名称
     * @return
     */
    public static Map<String, String> enumProp2Map(Class<? extends Enum> clz, String keyProp, String valueProp) {
        if (!clz.isEnum()) {
            return null;
        }
        try {
            Enum[] enums = clz.getEnumConstants();
            Map<String, String> rels = new HashMap<String, String>();
            for (Enum anEnum : enums) {
                rels.put((String) PropertyUtils.getProperty(anEnum, keyProp), (String) PropertyUtils.getProperty(anEnum, valueProp));
            }
            return rels;
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return null;
    }


}
